Blitz-Basic2 - Kurs 5/6

von
Thomas Krippner

[Anmerkung: Thomas hat uns den Kurs zur Verfügung gestellt, ich habe inhaltlich kaum etwas geändert. Ansonsten stehen meine Kommentare in eckigen Klammern, wobei ich nur Vermutungen anstellen kann, was Blitz- Basic angeht. Carsten Jahn]

Teil 5: Gadget-Programmierung

Heute geht es das erste Mal um sichtbare Ergebnisse unseres Bemühens: die Gestaltung einer Oberfläche mit Hilfe der GT Toolbox, eine mächtige Oberflächengestaltungslibrary des BB2.

Benutzeroberflächen sollten an den Benutzer angepaßt werden und deshalb ohne vordefinierten Werte [Thomas meint sicher die Schriftgröße und die Position der Buttons] (so gut das geht) auskommen. Wie man das macht, zeigt dieser Teil, der damit natürlich auch interessant für andere Sprachen ist, denn die Vorgehensweise ist immer gleich.

Doch jetzt gehts los:

Ein einfaches Beispiel zu Beginn, um ein wenig Grundlagen zu schaffen.

- Window mit Button Gadget

  WBStartup

  WBenchToFront_

  WbToScreen 0
  Use Screen 0
  *Scr = ActiveScreen

  ;Intuifont Bestimmen

  FH=Peek.w(Peek.l(*Scr+40)+4)
  FN$=Peek$(Peek.l(*Scr+40)+8)
  LoadFont 0,FN$,FH
  Use IntuiFont 0

  ; Window Oeffnen

  SH.w=Peek.w(*Scr+14)
  SW.w=Peek.w(*Scr+12)
  SB.b=Peek.b(*Scr+30)

  ;Window Begränzungen

  SizeLimits 200,120,SW,SH


  Window 0,0,SB,SW,SH-SB,$140F,"Gatget BB2-Kurs",1,2

  a=0:a$="Vorname"

  Gosub GadDef


  Repeat

         FlushEvents
         ev=WaitEvent

         ;Abfragen
         If ev=$40 AND GadgetHit = 0

                WLocate 1,30:Print "BUTTON GEDRÜKT "
                VWait 50
                WLocate 1,30:Print " "

         End If
  Until ev=$200
  End

  ; Gadget Definieren

  .GadDef
  WCls
  GTButton 0,0,0,0,100,FH+3,a$,$10

  ;In das Window Schreiben
  AttachGTList 0,0
  Return

[Die Beispiele sind wieder als Dateien unter Bin verfügbar.]

In diesem Programm wird nur verdeutlicht, wie ein Gadget erzeugt und abgefragt wird. Zu beachten ist, daß nicht das Anklicken eines Gadget bearbeitet wird, sondern das Loslassen. Siehe hierzu BB2-Handbuch "GT- Programmierung" oder "Gadget" und "Window".

An Erläuterungen gibt es nichts hinzuzufügen, es steht alles im Programm. Testen Sie dieses Programm, verändern sie die Parameter des GTButton und schauen Sie einmal in das BB2-Handbuch. Sie sollten es für das nächste Programm verstanden haben und die Befehle etwas kennen.

Wir stehen natürlich vor dem Problem, mehrere Gadgets voneinander unterscheiden zu müssen. Dabei hilft uns BB2 mit dem Befehl GadgetHit, der die ID des angeklickten Gadgets zurückgibt.

Wie man das am besten macht, zeigt das folgende Beispiel.

- Gadget selektieren


  WBStartup

  ; Kennen wir

  WBenchToFront_

  WbToScreen 0
  Use Screen 0
  *Scr = ActiveScreen

  ;Intuifont Bestimmen

  FH=Peek.w(Peek.l(*Scr+40)+4)
  FN$=Peek$(Peek.l(*Scr+40)+8)
  LoadFont 0,FN$,FH
  Use IntuiFont 0

  ; Window Oeffnen

  SH.w=Peek.w(*Scr+14)
  SW.w=Peek.w(*Scr+12)
  SB.b=Peek.b(*Scr+30)


  SizeLimits 200,120,SW,SH


  Window 0,0,SB,SW,SH-SB,$140F,"Gatget BB2-Kurs",1,2

  a=0:a$="Vorname"

  Gosub GadDef


  Repeat

         FlushEvents
         ev.l=WaitEvent


         If ev=$40

                Select GadgetHit

                 Case 0

                  WLocate 1,100:NPrint "Button 1 Gedr ckt"


                 Case 1

                  WLocate 1,100:NPrint "Button 2 Gedr ckt"

                End Select
         End If

  Until ev=$200
  End

  ; Gadget Definieren

  .GadDef
  WCls
  GTButton 0,0,0,0,200,FH+3"Button 1",$10
  GTButton 0,1,0,16,200,FH+3,"Button 2",$10
  AttachGTList 0,0
  Return

[Datei BlitzEx2.txt]

Wichtig ist nur die Select-Schleife. Mit dem Select-Befehl werten wir den GadgetHit aus und verzweigen dann mit Case. Hier steht der Code, der beim Klick auf ein Gadget ausgeführt wird. Natürlich ist dieser Programmteil bei jedem Programm anders.

ListView-Gadgets oder Cycle-Gadgets werden mit EventCode selektiert. Hier steht der Wert des Eintrages der angeklickt wurde, oder, im Fall des Cycle-Gadgets, der gerade aktive Eintrag.

Wie man mit dem EventCode umgeht, haben wir ja im vorherigen Kursteil besprochen und im BB2-Handbuch ist es auch gut beschrieben. Welche Gadgets es in BB2 noch gibt und welche Parameter diese haben, entnimmt man am besten dem BB2-Handbuch.

Ein weiteres Problem ist es, den Status eines Cycle-Gadgets oder andere Gadget-Informationen zu erhalten. Neben den Peek-Funktionen, mit denen wir den Status jedes Gadgets immer herausbekommen, gibt BB2 auch bestimmte Befehle und eine Tag-Einbindung vor. Die Befehle werden im BB2-Handbuch beschrieben. Hier soll ein Gadget-Tag anhand eines Cycle-Gadgets gezeigt werden.

BB2 gibt zwei Möglichkeiten vor, die es ermöglichen, an einen Gadget-Tag heranzukommen.

Die eine ist, resistente AmigaLib.res und vorbestimmte Variablen zu benutzen, die andere Möglichkeit ist es, die Variablen selber zu bestimmen, bzw. die Werte direkt einzugeben. Ich werde mich auf die letztere beziehen, da das Vorgehen identisch ist, wenn man die AmigaLib.res eingeladen hat.

- Cycle Gadget

  WBStartup

  ; Kennen wir

  WBenchToFront_

  WbToScreen 0
  Use Screen 0
  *Scr = ActiveScreen

  ;Intuifont Bestimmen

  FH=Peek.w(Peek.l(*Scr+40)+4)
  FN$=Peek$(Peek.l(*Scr+40)+8)
  LoadFont 0,FN$,FH
  Use IntuiFont 0

  ; Window Oeffnen

  SH.w=Peek.w(*Scr+14)
  SW.w=Peek.w(*Scr+12)
  SB.b=Peek.b(*Scr+30)


  SizeLimits 200,120,SW,SH

  ;Bestimmen der TagList

  GTTags $80080000,$80080000+15


  Window 0,0,SB,SW,SH-SB,$140F,"Gatget BB2-Kurs",1,2

  a=0:a$="Vorname"

  Gosub GadDef


  Repeat

         FlushEvents
         ev.l=WaitEvent


         If ev=$40

                Select GadgetHit

                 Case 0

                  WLocate 1,100:Print "Eintag Nummer ",GTGetAttrs(0,0,$80080000+15)

                End Select
         End If

  Until ev=$200
  End

  ; Gadget Definieren

  .GadDef
  WCls
  GTCycle 0,0,100,0,200,FH+5,"Gadget Text",1,"0 Eintrag|1 Eintrag|2 Eintrag"
  AttachGTList 0,0
  Return

[Datei: BlitzEx3.txt]

Der Befehl GTTags teilt der Intuition.Library mit, was wir über welches Gadget wissen möchten.

$80080000 ist der Basiswert und die addierte Zahl beschreibt den MessagePort, den wir mitgeteilt bekommen wollen. Dort liegt der Unterschied zur AmigaLibs.res Variante, bei der ich einfach eine mit # definierte Variable angeben kann. Ich kann sie aber auch selber bestimmen.

z.B.

  #Tag=$80080000:#TagCycle=$80080000+15

  GTTags #Tag,#TagCycle

Mit dem Befehl GTSetAttrs kann der Programmierer ein Attribut eines Gadgets auf einen bestimmten Wert setzten. Es lohnt sich auch die im BB2-Handbuch stehenden Seiten zu diesem Thema durchzulesen, viele sind es ja leider nicht ;).

[Es ist anzunehmen, daß in BB2 die gleichen Attribut-Tags benutzt werden, wie im Amiga-OS. Deshalb muß man sich nicht auf die BB2-Dokumentation beschränken, ein Blick in die Autodocs dürfte genügen.]

Doch nun kommen wir nach den Grundlagen zu unserem eigentlichen Thema, nämlich Gadgets an die Workbench anzugleichen.

Das Programm GADGET&WINDOW [vermutlich ein Blitzbasic-Beispielprogramm, das nicht Teil des Kurses ist] zeigt hier ein kleines Beispiel, das die Gadgets an das Window anpaßt und an den Rest der Oberfläche.

Das erste und einfachste ist die Angleichung an den IntuitionFont. Diesen zu ermitteln, einzuladen und zu aktivieren, wurde schon behandelt. Um das Gadget an diesen Font anzugleichen, ist es nötig, die Gadget-Höhe (FH) plus den gewünschten Abstand des Gadget Randes zum Textinneren anzugeben. Dies habe ich in den Beispielen schon gemacht.

Das Zweite ist, die Gadgets von der Länge an die Windowgröße anzugleichen. Dies ist auch sehr einfach. Wir nehmen die Windowbreite und Teilen sie durch die Gadgets, die in dieser Reihe liegen sollen. Wenn zum Beispiel in einer Reihe 4 Gadgets sitzen, würde es mathematisch so aussehen:

Breite des Gadgets = (Innere Breite des Windows / 4) - Abstand der Gadgets

So hätten wir die Breite und die Höhe der Gadgets bestimmt. Jetzt sind noch die Anfangspositionen zu bestimmen. Hier haben wir einen Bezugspunkt: der linke obere innere Punkt des Windows ist immer 0,0, also orientieren wir uns an diesem. Gehen wir zuerst in die Vertikale, also y-Achse.

Das erste Gadget geht von ganz oben (0) bis Fonthöhe Plus 5. Der Anfangspunkt des 2 Gadgets ist dann:

Anfangspunkt = Anfangsposition des Ersten Gadget + Fonthöhe + 5 + Abstand

Das Gadget darunter bezieht sich dann auf das zweite Gadget. In der Horizontalen ist das genau gleich.

Anfangspunkt = Anfangspunkt das ersten Gadgets + Breite des ersten Gadgets

Das erste Gadget kann auch das vorherige Gadget sein.

In der Grafik sind nochmal kurz die Zusammenhänge erläutert. [Siehe das Bild zur Veranschaulichung "verzgadget.gif" im Pics-Dir.]

Es ist meistens nötig, ein WindowSize-Limit zu setzen, sonst gehen die Gadgets ins Unleserliche oder überschneiden sich. Hier ist es wichtiger denn je, einmal alles auszuprobieren und sich nicht entmutigen zu lassen. Diese Art der Programmierung ist auch nicht das Nonplusultra, sondern einfach eine Möglichkeit, seine Benutzeroberfläche auf die Umstände etwas anzupassen.

Hierzu dürfte es noch viele Fragen geben, die ich besser in den FAQ`s beantworte, damit ich den Kurs nicht ins Detail führe und damit unnötig verlängere. [Im Moment ist dieses FAQ fast leer, deshalb wird es hier nicht aufgenommen. Vielleicht schreibt jemand dem Thomas seine Fragen an die o.g. eMail-Adresse.]

Es geht um das Prinzip, wie so eine Oberfläche gestaltet wird und daß es auch unter Amiga-OS ohne MUI einfach und leicht zu programmieren ist. Denn dieses Programm kann jeder nutzen, egal ob er MUI hat oder nicht. Es ist eben auf die Oberfläche des Benutzers eingestellt und nicht auf die Bequemlichkeit des Programmierers.

[Was für den Programmierer nun bequemer ist, sei dahingestellt...]

Im sechsten und letzten Kursteil, der in der nächsten Ausgabe erscheint, geht es um Menüs.


Prev Inhaltsverzeichnis Next
©`99 Der AmZeiger